package bit_operation;

public class Demo20250428 {

    // 位 1 的个数
    public int hammingWeight(int n) {
        // 干掉一个数二进制位中最右侧的 1，使用 n & (n - 1)
        int ret = 0;
        while (n != 0) {
            n &= (n - 1);
            ret++;
        }
        return ret;
    }

    // 汉明距离
    public int hammingDistance(int x, int y) {
        int count = 0;
        // 将 x, y 进行 ^ 计算, 有几位为 1 , 表示有几位不同
        int s = x ^ y;
        // 循环将 s 和 (s - 1) 进行 & 计算, 将最右侧的 1 变为 0
        while (s != 0) {
            s &= (s - 1);
            count++;
        }
        return count;
    }

    // 比特位计数
    public int[] countBits(int n) {
        // 创建返回的数组 ret
        int[] ret = new int[n + 1];
        // 遍历数组
        for (int i = 0; i <= n; i++) {
            // 计数器
            int count = 0;
            // 因为不能改变 i 的值，所以应该把 i 赋给一个临时变量 tmp
            int tmp = i;
            // 求出 tmp 中有几个 1 
            while (tmp != 0) {
                tmp &= (tmp - 1);
                count++;
            }
            ret[i] = count;
        }
        return ret;
    }


    // 只出现一次的数字
    public int singleNumber(int[] nums) {
        int ret = 0;
        // 将所有数字 ^ 在一起
        for (int i = 0; i < nums.length; i++) {
            ret ^= nums[i];
        }
        return ret;
    }

    
}
